<?php


	/**
	 * Boxok kezelése.
	 * 
	 * @author ironhawk
	 *
	 */
	class BoxHandler {
		
		/**
		 * Box objektumok szerkezete nyelvkóddal kulcsolva. Elemei id-vel kulcsolt Box objektumok asszociatív tömbje
		 * 
		 * @var array
		 */
		private static $_boxes = array();
		
		/**
		 * Ez a cikk került ki, ehhez kéne szabni a boxokat.
		 * Ha nincs kint cikk, akkor null érkezik.
		 * 
		 * @param int $articleId ez a cikk van kint vagy null ha nincs kint cikk
		 */
		public static function initBoxesForArticle($articleId, $langcode)
		{
			$targetWeights = null;
			$articleContentListIds = null;
			
			// ok, most bejárjuk a boxokat
			$boxes = BoxHandler::getBoxes($langcode);
			foreach($boxes as $boxPlaces)
			{
				foreach($boxPlaces as $boxObj) {
					$boxObj->initContentForArticle($articleId);
				}
			}
		}
		
		
		/**
		 * Javascript-ben is tudnunk kell minimális dolgokat a boxokról.
		 * Kb. annyit hogy hány van, mi az id-jük, és melyik milyen magas...
		 * 
		 * @return string
		 */
		public static function getBoxesJavascriptRepresentation($langcode)
		{
			$src = array();
			array_push($src, "var boxIds = new Array();");
			array_push($src, "var boxHeights = new Array();");
			array_push($src, "var boxClosed = new Array();");
			array_push($src, "var boxAutoNext = new Array();");
			array_push($src, "var boxAutoNextTime = new Array();");

			$boxes = BoxHandler::getBoxes($langcode);
			foreach($boxes as $boxPlace)
			{
				foreach($boxPlace as $boxObj)
				{
					if(!$boxObj->hidden) {
						array_push($src, "boxIds.push($boxObj->id);");
						array_push($src, "boxHeights[$boxObj->id] = $boxObj->height;");
						array_push($src, "boxClosed[$boxObj->id] = " . ($boxObj->closed? "true": "false") . ";");
						$boxContentListObj = $boxObj->getDefaultTab()->getDefaultBoxContentList();
						if (! empty($boxContentListObj->autoStep)) {
							$nextLink = HydraLinkProvider::getLink("axBoxNext", array("boxId"=>$boxObj->id));
							array_push($src, "boxAutoNext[$boxObj->id] = '$nextLink';");
							array_push($src, "boxAutoNextTime[$boxObj->id] = $boxContentListObj->autoStep;");
						}
					}
				}
			}
			
			return implode("\n", $src);
		}
		
		
		/**
		 * Megmondja hogy volt-e már betöltés művelet ezen a nyelven, van-e bent struktúra
		 * @param string $langcode melyik nyelven?
		 * @return boolean
		 */
		public static function isLoaded($langcode)
		{
			return isset(BoxHandler::$_boxes[$langcode]);
		}
		
		/**
		 * Betölti a boxokat db-ből, és feltölti a teljes szerkezetet
		 *
		 * @param string $langcode melyik nyelven?
		 * @return true ha sikerült, false ha hiba volt közben - de mindez csak tájékoztató jellegű dolog...
		 */
		public static function loadFromDB($langcode)
		{
			$boxes = FunctionLibrary::getArrayValue(BoxHandler::$_boxes, $langcode);
			if(is_null($boxes))
				$boxes = array();
			
			$boxRecs = SiteDBHelper::getBoxes($langcode);
			if(is_null($boxRecs))
			{
				$msg = "failed to init box structure due to db error!";
				Log::error($msg);
				MailHelper::sendAdminMail("box system failed", $msg);
				return false;
			}
			
			// oké, építsük fel a struktúrát!
			foreach($boxRecs as $boxRec)
			{
				$boxObj = new Box($boxRec);
				if (! isset($boxes[$boxObj->place])) {
					$boxes[$boxObj->place] = array();
				}
				$boxes[$boxObj->place][$boxObj->id] = $boxObj;
			}
			
			// végül tegyük a helyére
			BoxHandler::$_boxes[$langcode] = $boxes;
		}
		
		/**
		 * Hozzáaad manuálisan egy box-ot a dobozokhoz
		 * 
		 * @param Box $box
		 * @param string $langcode
		 */
		public static function addBox($box, $langcode) {
			
			$boxes = FunctionLibrary::getArrayValue(BoxHandler::$_boxes, $langcode);
			if(is_null($boxes))
				$boxes = array();
				
			$boxes[$box->place][$box->id] = $box;

			BoxHandler::$_boxes[$langcode] = $boxes;
		}
		
		
		/**
		 * Visszaadja a box objektumok "place"-ével kulcsolt tömböt, bennük id-vel kulcsolt boxok tömbjét
		 * @param string $langcode melyik nyelven?
		 * @return array null ha az adott nyelven nincs még betöltve a struktúra, a struktúra ha megvan
		 */
		public static function getBoxes($langcode)
		{
			if(isset(BoxHandler::$_boxes[$langcode]))
				return BoxHandler::$_boxes[$langcode];
				
			return null;
		}
		
		
		
		/**
		 * Visszaadja az adott id-jű Box objektumot ha van, vagy null ha nincs
		 * 
		 * És kompatibilitási okokból a NewsBox-ot is vissza kell tudnia adni!
		 * 
		 * @param int $id melyik box?
		 * @param string $langcode melyik nyelven?
		 * @return Box
		 */
		public static function getBox($id, $langcode)
		{
			$boxes = BoxHandler::getBoxes($langcode);
			if(is_null($boxes))
				return null;

			$box = null;
			foreach ($boxes as $boxPlaces) {
				if(isset($boxPlaces[$id]))
					return $boxPlaces[$id];
			}
			return $box;
		}
		
		
		/**
		 * Megmondja h az adott cikk használatban van-e a content listákon, és ha igen akkor
		 * mely content listákon.
		 * Ha olyan nyelvre kérdezed, ami még nincs betöltve, akkor a betöltés automatikusan megtörténik
		 * 
		 * @param $articleId
		 * @param string $langcode melyik nyelven?
		 * @return array null ha egyetlen box-content listán sincs használatban, amúgy a lista elemek tömbje, melyek használják
		 */
		public static function getBoxContentListsWhereArticleIsUsed($articleId, $langcode)
		{
			$boxes = BoxHandler::getBoxes($langcode);
			if(is_null($boxes))
			{
				// nincs még betöltve, töltsük be!
				BoxHandler::loadFromDB($langcode);
				$boxes = BoxHandler::getBoxes($langcode);
			}
			
			$allUsed = null;
			foreach($boxes as $boxPlaces)
			{
				foreach($boxPlaces as $boxObj) {
					$contentListsOfBoxes = $boxObj->getBoxContentListsWhereArticleIsUsed($articleId);
					$allUsed = FunctionLibrary::arrayConcatenate($allUsed, $contentListsOfBoxes);
				}
			}
			
			return $allUsed;
		}
		
		
		/**
		 * Megmondja hogy van-e akár egyetlen content list is bármely box bármely tab-ban ami használja
		 * az adott cikket avagy nem
		 * Ha olyan nyelvre kérdezed, ami még nincs betöltve, akkor a betöltés automatikusan megtörténik
		 * 
		 * @param $articleId
		 * @param string $langcode melyik nyelven?
		 * @return boolean
		 */
		public static function isArticleUsed($articleId, $langcode)
		{
			$boxes = BoxHandler::getBoxes($langcode);
			if(is_null($boxes))
			{
				// nincs még betöltve, töltsük be!
				BoxHandler::loadFromDB($langcode);
				$boxes = BoxHandler::getBoxes($langcode);
			}
			
			foreach($boxes as $boxPlaces)
			{
				foreach($boxPlaces as $boxObj) {
					if($boxObj->isArticleUsed($articleId))
						return true;
				}
			}
			
			
			return false;
		}
		
	}
?>
